7.3栅格数据可视化
7.3.1 环境矩阵数据可视化(二维)
https://github.com/ChrKoenig/R_marginal_plot
marginal_plot = function(x, y, group = NULL, data = NULL, lm_show = FALSE, lm_formula = y ~ x, bw = "nrd0", adjust = 1, alpha = 1, plot_legend = T, ...){
require(scales)
moreargs = eval(substitute(list(...)))
if(missing(group)){
if(missing(data)){
if(length(x) != length(y)){stop("Length of arguments not equal")}
data = data.frame(x = as.numeric(x), y = as.numeric(y))
} else {
data = data.frame(x = as.numeric(data[,deparse(substitute(x))]),
y = as.numeric(data[,deparse(substitute(y))]))
}
if(sum(!complete.cases(data)) > 0){
warning(sprintf("Removed %i rows with missing data", sum(!complete.cases(data))))
data = data[complete.cases(data),]
}
group_colors = "black"
} else {
if(missing(data)){
if(length(x) != length(y) | length(x) != length(group)){stop("Length of arguments not equal")}
data = data.frame(x = as.numeric(x), y = as.numeric(y), group = as.factor(group))
} else {
data = data.frame(x = as.numeric(data[,deparse(substitute(x))]),
y = as.numeric(data[,deparse(substitute(y))]),
group = as.factor(data[,deparse(substitute(group))]))
}
if(sum(!complete.cases(data)) > 0){
warning(sprintf("Removed %i rows with missing data", sum(!complete.cases(data))))
data = data[complete.cases(data),]
}
data = subset(data, group %in% names(which(table(data$group) > 5)))
data$group = droplevels(data$group)
group_colors = rainbow(length(unique(data$group)))
}
if(!is.null(moreargs$log)){
if(!moreargs$log %in% c("y", "x", "yx", "xy")){
warning("Ignoring invalid 'log' argument. Use 'y', 'x', 'yx' or 'xy.")
} else {
data = data[apply(data[unlist(strsplit(moreargs$log, ""))], 1, function(x) !any(x <= 0)), ]
data[,unlist(strsplit(moreargs$log, ""))] = log10(data[,unlist(strsplit(moreargs$log, ""))])
}
moreargs$log = NULL
}
if(!is.null(moreargs$col)){moreargs$col = NULL}
if(!is.null(moreargs$type)){moreargs$type = "p"}
if(is.null(moreargs$xlim)){moreargs$xlim = range(data$x)}
if(is.null(moreargs$ylim)){moreargs$ylim = range(data$y)}
if(is.null(moreargs$xlab)){moreargs$xlab = deparse(substitute(x))}
if(is.null(moreargs$ylab)){moreargs$ylab = deparse(substitute(y))}
if(is.null(moreargs$las)){moreargs$las = 1}
tryCatch(expr = {
ifelse(!is.null(data$group), data_split <- split(data, data$group), data_split <- list(data))
orig_par = par(no.readonly = T)
par(mar = c(0.25,5,1,0))
layout(matrix(1:4, nrow = 2, byrow = T), widths = c(10,3), heights = c(3,10))
plot(NULL, type = "n", xlim = moreargs$xlim, ylab = "density",
ylim = c(0, max(sapply(data_split, function(group_set) max(density(group_set$x, bw = bw)$y)))), main = NA, axes = F)
axis(2, las = 1)
mapply(function(group_set, group_color){lines(density(group_set$x, bw = bw, adjust = adjust), col = group_color, lwd = 2)}, data_split, group_colors)
par(mar = c(0.25,0.25,0,0))
plot.new()
if(!missing(group) & plot_legend){
legend("center", levels(data$group), fill = group_colors, border = group_colors, bty = "n", title = deparse(substitute(group)), title.adj = 0.1)
}
par(mar = c(4,5,0,0))
if(missing(group)){
do.call(plot, c(list(x = quote(data$x), y = quote(data$y), col = quote(scales::alpha("black", alpha))), moreargs))
} else {
do.call(plot, c(list(x = quote(data$x), y = quote(data$y), col = quote(scales::alpha(group_colors[data$group], alpha))), moreargs))
}
axis(3, labels = F, tck = 0.01)
axis(4, labels = F, tck = 0.01)
box()
if(lm_show == TRUE & !is.null(lm_formula)){
mapply(function(group_set, group_color){
lm_tmp = lm(lm_formula, data = group_set)
x_coords = seq(min(group_set$x), max(group_set$x), length.out = 100)
y_coords = predict(lm_tmp, newdata = data.frame(x = x_coords))
lines(x = x_coords, y = y_coords, col = group_color, lwd = 2.5)
}, data_split, rgb(t(ceiling(col2rgb(group_colors)*0.8)), maxColorValue = 255))
}
par(mar = c(4,0.25,0,1))
plot(NULL, type = "n", ylim = moreargs$ylim, xlim = c(0, max(sapply(data_split, function(group_set) max(density(group_set$y, bw = bw)$y)))), main = NA, axes = F, xlab = "density")
mapply(function(group_set, group_color){lines(x = density(group_set$y, bw = bw, adjust = adjust)$y, y = density(group_set$y, bw = bw)$x, col = group_color, lwd = 2)}, data_split, group_colors)
axis(1)
}, finally = {
par(orig_par)
})
}
7.3.2 ggplot2可视化栅格
library(raster)
library(ggplot2)
library(rasterExtras)
library(RSpatial)
library(spocc)
library(dplyr)
occ <- scau
source("c:/Users/admin/Desktop/sdmenm.R")
bio1 <- raster("wc10/bio1.bil")
rang <- mcp(occ)
ggraster <- function(data,occ,mcp = FALSE){
if(mcp == TRUE){
rang <- mcp(occ)
data <- raster::crop(data,rang)
}else{
data =data
}
data2 <- as.data.frame(data,xy=T)
names(data2)[3] <- 'value'
names(occ) <- c("longitude", "latitude")
titll <- toupper(deparse(substitute(data)))
ggplot() +
geom_raster(data = data2, aes(x = x, y = y, fill = value)) +
geom_point(data=occ, aes(x=longitude, y=latitude ),size= 5, col='green', cex=0.1) +
coord_quickmap() +
theme_bw() +
scale_fill_gradientn(colours=rev(terrain.colors(10)),
na.value = "#CCCCCC7f")+
ggtitle(titll)
}
ggplotclass <- function(data){
class <- summary(round(data,3)) %>% data.frame()
vacl <- class[,1][1:5]
vacl2 <- c(vacl[1:2],1,vacl[2:3],2,vacl[3:4],3,vacl[4:5],4)
ff <- reclassify(data2,vacl2)
library(rasterVis)
gplot(ff) +
geom_raster(aes(fill = factor(value))) +
coord_equal()+
guides(color=guide_legend(title = deparse(substitute(data))))
}
7.3.3可视化物种概率密度池:
https://github.com/ChrKoenig/probpool/blob/master/demo/probpool.R
library(probpool)
example_pp = probpool(env_pool = Ranunculaceae$Ran_env,
disp_pool = Ranunculaceae$Ran_disp,
occurrences = Ranunculaceae$Ran_occ,
interaction_matrix = Ranunculaceae$Ran_int, interaction_method = 1)
class(example_pp)
print(example_pp)
show(example_pp)
summary(example_pp)
plot(example_pp, main = "Ranunculaceae dataset")
plot(example_pp, focal_species = "Thal_simp", main = "Thalictrum simplex")
plot(example_pp, focal_unit = c(1242,1241))
7.3.6 rastervis可视化栅格专包
## rastervis参见如下网站:
https://oscarperpinan.github.io/rastervis/
http://rstudio-pubs-static.s3.amazonaws.com/16756_56e9817f4cab42ceae5bc28b788c2c01.html
https://rpubs.com/alobo/rasterOnGM
## 基于高程线采用反距离加权法构建高程;
https://www.r-bloggers.com/2019/04/r-as-gis-for-ecologists/
https://www.rayshader.com/
7.3.7 可视化DEM
## 制作立体效果的2D地形图:
slope <- terrain(elevation, opt = "slope")
aspect <- terrain(elevation, opt = "aspect")
hill <- hillShade(slope, aspect, 40, 270)
plot(hill, col = grey(0:100/100), legend = FALSE, main = "Spain")
plot(elevation, col = rainbow(25, alpha = 0.35), add = TRUE)
7.7.8 可视化环境变量-maps
bio10xx <- reclassify(bio10x,rcl=c(-Inf,24,1, 24,28,2, 28,30,3, 30,Inf,4))
m_class <- c(-Inf,24,1, 24,28,2, 28,30,3, 30,Inf,4)
bio10x %>% crop(.,range) %>% mask(.,range) %>%
reclassify(m_class) %>%
as.factor() -> r_class
levels(r_class)[[1]]$names <- c("24<","24-28","28-30",">30")
names(r_class) <- "BIO10"
r_class %>%
tm_shape() +
tm_raster(legend.show = TRUE,
n = 4)+
tm_legend(position=c("left","bottom"), frame=FALSE)+
tm_shape(occ_data)+
tm_symbols(col = "red", scale = .5,size=0.5,alpha = 0.7) +
tm_shape(clip2)+
tm_borders(col="gray50",alpha = 0.6)+
tm_scale_bar(position=c("left", "top"),text.size = 0.8) +
tm_compass(type = "4star", position=c("right", "top")) +
tm_xlab("Longitude",size = 1) +
tm_ylab("Latitude",size = 1)+
tm_graticules(ticks = TRUE,lines=FALSE)